package com.tbgov.util;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;

public class IdCardEncryptUtil {

    // AES 密钥
    private static final String AES_KEY = "q7468RYVNAkHMIXZF5pStA==";

    /**
     * 隐藏身份证号后四位（替换为星号）
     *
     * @param idCard 身份证号
     * @return 隐藏后的身份证号
     */
    public static String hideLastFour(String idCard) {
        if (idCard == null || idCard.length() < 4) {
            return idCard; // 如果身份证号长度不足4位，直接返回
        }
        return idCard.substring(0, idCard.length() - 4) + "****";
    }

    /**
     * 使用 MD5 加密身份证号后四位
     *
     * @param idCard 身份证号
     * @return 加密后的身份证号
     */
    public static String encryptLastFourWithMD5(String idCard) {
        if (idCard == null || idCard.length() < 4) {
            return idCard; // 如果身份证号长度不足4位，直接返回
        }
        String lastFour = idCard.substring(idCard.length() - 4);
        String md5LastFour = md5(lastFour);
        return idCard.substring(0, idCard.length() - 4) + md5LastFour;
    }

    /**
     * 使用 AES 加密身份证号后四位
     *
     * @param idCard 身份证号
     * @return 加密后的身份证号
     */
    public static String encryptLastFourWithAES(String idCard) {
        if (idCard == null || idCard.length() < 4) {
            return idCard; // 如果身份证号长度不足4位，直接返回
        }
        String lastFour = idCard.substring(idCard.length() - 4);
        String encryptedLastFour = aesEncrypt(lastFour, AES_KEY);
        return idCard.substring(0, idCard.length() - 4) + encryptedLastFour;
    }

    /**
     * MD5 加密
     *
     * @param data 原始数据
     * @return 加密结果
     */
    private static String md5(String data) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(data.getBytes(StandardCharsets.UTF_8));
            StringBuilder sb = new StringBuilder();
            for (byte b : digest) {
                sb.append(String.format("%02x", b & 0xff));
            }
            return sb.toString();
        } catch (Exception e) {
            throw new RuntimeException("MD5 加密失败", e);
        }
    }

    /**
     * AES 加密
     *
     * @param data 明文
     * @param key  密钥
     * @return 加密后的密文
     */
    private static String aesEncrypt(String data, String key) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(encrypted);
        } catch (Exception e) {
            throw new RuntimeException("AES 加密失败", e);
        }
    }

    public static void main(String[] args) {
        String idCard = "123456789012345678";

        // 隐藏后四位
        System.out.println("隐藏后四位: " + hideLastFour(idCard));

        // 使用 MD5 加密后四位
        System.out.println("MD5 加密后四位: " + encryptLastFourWithMD5(idCard));

        // 使用 AES 加密后四位
        System.out.println("AES 加密后四位: " + encryptLastFourWithAES(idCard));
    }
}
